【毅力挑战】PCIe 每日一问一答(2022.05 已归档) 您所在的位置:网站首页 用where are you造句一问一答 【毅力挑战】PCIe 每日一问一答(2022.05 已归档)

【毅力挑战】PCIe 每日一问一答(2022.05 已归档)

2024-06-24 17:50| 来源: 网络整理| 查看: 265

本文意在督促自己持续学习 PCIe。日更长文做不到,但三言两语总该能写出来。一天至少更新一个 PCIe 相关知识点,聚沙成塔、集腋成裘,相信几年下来总能覆盖绝大部分的 PCIe 知识面。本文注定越往后越难更,看我能坚持多久吧。

👉 本篇为 2022.05 归档,点击查看总目录 👈

文章目录 2022 年5 月2022.05.01 - First DW BE、Last DW BE 是什么?2022.05.02 - PCIe Scrambling 中有哪两种 LFSR 方案?2022.05.03 - 为什么要关闭加扰 Scrambling?2022.05.04 - 128b/130b 编码时,Sync Header 和 TS Symbol 0 不做 Scrambling,不会影响 DC Balance 吗?2022.05.05 - PCIe 是如何检测块对齐丢失的?2022.05.06 - STP 中的 FCRC 和 FP 都是干啥的?2022.05.07 - EIOS 截断是什么?2022.05.08 - 如果发送的 FTS 不够,导致从 L0s 回退到 L0 失败了怎么办?2022.05.09 - PCIe 数据链路层是做什么的?有哪些功能?2022.05.10 - DLLP 是什么?2022.05.11 - DLLP 分为哪几类?2022.05.12 - NOP DLLP 是什么?有何作用?什么时候发 NOP DLLP? 收到后该如何处理?2022.05.13 - Data Link Feature DLLP 是什么?有何作用?什么时候发?2022.05.14 - DLLP 自身是如何保证其数据完整性的?2022.05.15 - LCRC 和 ECRC 有何区别?2022.05.16 - 几种不同的 TLP 同时要发送时候,该怎么发?2022.05.17 - 几种不同的 DLLP 同时要发送时候,该怎么发?2022.05.18 - TLP、OS、DLLP 同时要发送时,该怎么发?2022.05.19 - ACK/NAK 机制是什么?2022.05.20 - 每个 TLP 都要回复 Ack 吗?Ack 要多久发一次?2022.05.21 - 什么情况下会发送 Nak DLLP?2022.05.22 - TLP Tx 收到 Nak 后如何处理?2022.05.23 - 连续多次重传失败后如何处理?2022.05.24 - Retry 机制中用到的 Tx Retry Buffer Size是如何计算的?2022.05.25 - 数据链路控制状态机是做什么的?2022.05.26 - DLCMSM 跟 LTSSM 有啥关系?2022.05.27 - DL_Feature 期间要交换哪些 Feature?2022.05.28 - PCIe Flow Control 是什么?2022.05.29 - PCIe Flow Control 用到了哪些 DLLP?2022.05.30 - Flow Control 初始化流程是怎样的?2022.05.31 - InitFC1 和 InitFC2 有何区别?

2022 年 5 月 2022.05.01 - First DW BE、Last DW BE 是什么?

  First DW BE 和 Last DW BE 是 Memory 读写请求 TLP Header 中的一个字段,指示读写请求数据载荷中的第一个及最后一个 DW 中的数据 Byte 是否有效。First DW BE[3:0] 对应第一个 DW 的 Byte[3:0],Last DW BE[3:0] 对应最后一个 DW 的 Byte[3:0],如图 1 所示。

  若 BE 某 bit 为 0,表示该 byte 数据不能写入 Memory 或不可预取、不可读。若请求长度大于 1 DW,First DW BE 不能为 0;若请求长度等于 1 DW,Last DW BE 只能为 0;First/Last DW BE 的 4 bit 可以不连续。对于 Zero Read/Write,First/Last DW BE 均为 0。

在这里插入图片描述

▲图 1: First/Last DW Byte Enable 位置对应关系 2022.05.02 - PCIe Scrambling 中有哪两种 LFSR 方案?

  PCIe Scrambling 中常用的两种 LFSR 方案为 Separated LFSR 与 Shared LFSR。

Separated LFSR 方案,或称 Individual LFSR,是指 PCIe 链路中每条 Lane 都单独配一个 LFSR 进行 Scrambing,各条 Lane 的 LFSR 有自己的 Seed。 其原理图如图 2 所示。Shared LFSR,从名字也看得出来,共享的 LFSR,是指 PCIe 链路中所有链路共享同一 LFSR,不同 Lane 采用不同的抽头点位,其原理图如图 3 所示。

在这里插入图片描述

▲图 2: Individual LFSR 原理图

在这里插入图片描述

▲图 3: Shared LFSR 原理图 2022.05.03 - 为什么要关闭加扰 Scrambling?

  默认情况下 Scrambling 是打开的。Scrambling 的确有很多好处,比如减低 EMI,但在设备调试阶段,工程人员想要更容易地查看传输的数据,数据 Scrambling 无疑增加了数据辨识难度。为了更容易地查看传输数据,可以选择关闭 Scrambling 功能。只能在链路训练的 Configuration.Complete 阶段通过发送 Disable Scrambing 位(Symbol 5 Bit 3)为 1 的 TS1 或 TS2 来关闭对端的 Scrambling 功能,且只能在 8b/10b 编码期间来关闭 Scrambling。

2022.05.04 - 128b/130b 编码时,Sync Header 和 TS Symbol 0 不做 Scrambling,不会影响 DC Balance 吗?

  128b/130b 编码时 Sync Header 和 TS Symbol 0 不做 Scrambling,不会影响 DC Balance。Sync Header 为 01b 或 10b,TS Symbol 0 为 1Eh(00011110b),0、1 数量相同,本身已经实现了 DC Balance。

2022.05.05 - PCIe 是如何检测块对齐丢失的?

  在链路训练期间,若 Rx 检测到了未定义的 Sync Header,则认为块对齐丢失(Loss of Block Alignment)。块对齐丢失是因为 Rx Block Alignment 失败,需要重新回退到 Unaligned Phase 进行块对齐。

2022.05.06 - STP 中的 FCRC 和 FP 都是干啥的?

  STP,Start of TLP,在 128b/130b 编码 Data Block 中指示开始发送 TLP 的 Frame Token,如图 2 所示。该 Token 中携带有接下来要发送的 TLP Length 及 TLP Sequence Number。TLP Length 是个相当重要的字段,为了保护该字段,STP 中规划了 FCRC (Frame CRC) 及 FP (Frame Parity) 两个字段来对 TLP Length 进行保护。

  FCRC 通过 10 Bit TLP Length 按照一定算法计算获得,只保护 TLP Length,能够检测出 2 Bit 错误。常规 FP 奇偶校验则是校验 TLP Length 及 FCRC 字段,缩减版 FP 只检验 TLP Length 中的特定位,能够检测出奇数位的 Bit 错误。

在这里插入图片描述

▲图 4: STP Frame Token 2022.05.07 - EIOS 截断是什么?

  128b/130b 编码时,EIOS 由 16 个 66h 组成。若当前发送的 EIOS 之后紧接着还有 EIOS,那么必须发送完完整的 16 个 66h 当前 EIOS 才算发送完毕。若发送完当前 EIOS 接下来便进入电气闲,那么发送完 14 个 66h 后就可以停止发送 剩下的 66h,仍认为当前 EIOS 发送完毕,称为 EIOS 截断。

  EIOS 截断是为了解决 128b/130b 编码期间发送端可能存在的符号边界上的时钟边界不对齐情况。EIOS 截断不会影响接收端对 EIOS 的判断,因为接收端只需要收到 6 个 EIOS 就可以做出接收到 EIOS 的判断了。

2022.05.08 - 如果发送的 FTS 不够,导致从 L0s 回退到 L0 失败了怎么办?

  从 L0s 回退到 L0 时,Tx 发送 N_FTS 个 FTS。如果 Rx 在此期间实现了位锁定、符号锁定及块对齐,那么能够成功 回退到 L0。如果 Rx 再次期间没有完成位锁定、符号锁定及块对齐,那么 Rx 会超时退到 Recovery,沟通加大 N_FTS,在 Recovery 阶段完成未完成的锁定及对齐工作,然后进入 L0。

2022.05.09 - PCIe 数据链路层是做什么的?有哪些功能?

  PCIe 数据链路层位于事务层与物理层之间,用以保证数据传输的可靠性。

  其主要功能如下:

TLP 数据交换。在发送端,数据链路层负责接收事务层发来的 TLP,添加 Sequence Number 及 LCRC 后交给物理层;在接收端,数据链路层负责接收物理层发来的 TLP,数据完整性检测通过后交给事务层。此外,数据链路层负责 TLP 流控。错误检测及重传。数据链路层基于 ACK/NAK 机制来检测有无 TLP 损坏或丢包,在出现损坏或丢包时通过 Retry 机制请求重传。若发送端长时间等不到相应 TLP 的 ACK,还有 Timeout 机制来保证重传。链路初始化及电源管理。PCIe 初始化过程中,数据链路层监测 PCIe Link 的 Reset、Active、Disconnected 等状态并传递到事务层。在 LTSSM 跳转到 L0 状态后,数据链路层交换 FC DLLP 进行流控初始化。此外,在允许过程中,PCIe Link 双方的数据链路层交换 PM DLLP 实现功耗管理及电源管理。 2022.05.10 - DLLP 是什么?

  DLLP,全称 Data Link Layer Packet,数据链路层包,用以 PCIe 链路管理及维护(链路初始化、电源管理等)。DLLP 仅在 PCIe 链路两端设备的数据链路层之间传输,其源于发送端设备的数据链路层,终于接收端设备的数据链路层。当 TLP 及 DLLP 均需要发送时,按照一定规则交替发送。

2022.05.11 - DLLP 分为哪几类?

  根据功能的不同,DLLP 大致可分四类:

ACK/NAK DLLP(TLP 应答 DLLP)。包括 ACK、NAK,用以决定重传还是丢弃 Tx Retry Buffer 中的 TLP。FC DLLP(Flow Control DLLP)。包括 InitFC1-P、InitFC1-NP、InitFC1-Cpl、InitFC2-P、InitFC2-NP、InitFC2-Cpl、UpdateFC-P、UpdateFC-NP 及 UpdateFC-Cpl,用以初始化及更新流控信用量(Flow Control Credit)。PM DLLP (Power Management DLLP)。包括 PM_Enter_L1、PM_Enter_L23、PM_Active_State_Request_L1 及 PM_Request_Ack,用以进行功耗及电源管理。Vendor Defined DLLP。厂商自定义的 DLLP。

  ACK/NAK、FC 及 PM DLLP 均为链路管理 DLLP。此外,还有 MR、NOP 及 Data_Link_Feature DLLP。各 DLLP 类型之间通过 DLLP 中的 Tyte 字段 (Byte0) 进行区分。

2022.05.12 - NOP DLLP 是什么?有何作用?什么时候发 NOP DLLP? 收到后该如何处理?

  NOP(No Operation)DLLP 是 PCIe 3.0 引入的概念,其帧格式下图所示,Payload 字段(Byte1~3)为任意值。NOP DLLP 仅用于链路测试场景,常规操作模式时不应发送 NOP DLLP,接收端接收到 NOP DLLP 后,在做完数据数据完整性检测后直接丢弃。

在这里插入图片描述

▲图 5: NOP DLLP Format 2022.05.13 - Data Link Feature DLLP 是什么?有何作用?什么时候发?

  Data Link Feature DLLP 是一种携带有数据链路层 Feature 及相关 Ack 信息的 DLLP,数据链路层处于 DL_Feature 状态(可选)时,PCIe 链路两端的数据链路层通过 Data_Link_Feature DLLP 来告知彼此支持的数据链路层特性。

  Data_Link_Feature DLLP 帧格式如下图所示,其中 Feature Support 字段来源于其 Data Link Feature Capabilities Register 的 Local Data Link Feature Supported 字段,目前只有 Local Scaled FC 这一个 Feature。当本端接收到对端发来的 Data_Link_Feature DLLP 后,回复以 Feature Ack 置一的 Data_Link_Feature DLLP。

在这里插入图片描述

▲图 6: Data_Link_Feature DLLP Format 2022.05.14 - DLLP 自身是如何保证其数据完整性的?

  首先,若能够接收到 DLLP,每一笔 DLLP 都携带有 2B CRC,来保证接收 DLLP 的正确性。

  其次,若 DLLP 丢包,对于 Ack/Nak DLLP,要么没有影响(短暂丢 Ack),要么有 Timeout 机制来保证 TLP 重传(丢 Nak,长时间丢 Ack)。对于 PM DLLP,会重复多次或者持续发送相关 DLLP,确保对端能够收到。对于 FC DLLP,发送端在收到对端发来的 InitFC 前会一直定时发送 InitFC 给对端;对于 UpdateFC,其是定时发送的,偶尔丢一个影响不大,采用最新收到的 Credit 就好了。

2022.05.15 - LCRC 和 ECRC 有何区别?

  ECRC,End-to-End CRC,由事务层生成及解析,是可选的,是 TLP 的组成部分,Size 4B,位于 Data Payload 之后。ECRC 始于 Requester,终于 Completer,不会被 Switch 等中间节点修改。ECRC 错误是不可纠正错误,若 Switch 发现 ECRC 出错,其记录错误并继续转发;若 Completer 发现 ECRC 出错,则上报错误请求系统处理。

  LCRC,Link CRC,由数据链路层生成及解析,是必选的,Size 4B,添加在 TLP 之后。LCRC 始于 PCIe 链路的发送端数据链路层,终于 PCIe 链路的接收端数据链路层,途径 Switch 时需要进行校验并重新进行计算填充。LCRC 是可纠正错误,若接收端检测到 LCRC 出错,其请求重发该 TLP。

参考与友链:ECRC vs LCRC – PCIe技术网

2022.05.16 - 几种不同的 TLP 同时要发送时候,该怎么发?

  若 Cfg/Mem/IO Write/Read、Completion、Message 等几种不同的 TLP 同时需要发送,Synopsys 推荐按照以下优先级进行发送:

当前传输中的 TLP 请求的 CompletionRetry Buffer 内需要重传的 TLPPCIe Controller 内部事务层新生成的 MessagePCIe Controller 内部事务层新生成的 CompletionPCIe 用户接口新生成的待发 TLP 2022.05.17 - 几种不同的 DLLP 同时要发送时候,该怎么发?

  若几种不同的 DLLP 同时,建议按照以下由高到低的优先级进行发送:

当前传输中的 DLLP 请求的 CompletionNAK DLLpACK DLLPFC DLLPVendor Defined DLLPPM DLLP 及其他 DLLP 2022.05.18 - TLP、OS、DLLP 同时要发送时,该怎么发?

  若数据链路层同时有 TLP、TS、DLLP 要发送时,是需要按照一定的优先级进行发送的。官方文档中给了一直建议的发送顺序(不强制),优先级从高到低依次为:

进行中的 TLP 或 DLLP 的 CompletionOrdered Set(这个是在 Mindshare 文档提到的)Nak DLLPAck DLLPFC DLLP(遵循流控规则要求的比较紧急的 FC DLLP)Retry Buffer 内需要重传的 TLPFC DLLP(其他不紧急的 FC DLLP)事务层待发的 TLP其他 DLLP,比如 NOP DLLP 及 Vender Defined DLLP 2022.05.19 - ACK/NAK 机制是什么?

  PCIe 通过 ACK/NAK 机制来保证 TLP 在 PCIe 链路上的 End-to-End 可靠传输。

  PCIe ACK/NAK 机制示意图如下图所示,通过几个关键要素来简单介绍 ACK/NAK 机制:

Sequence Number,LCRC。发送端数据链路层在每一笔要发送的 TLP 前添加连续编号的 Sequence Number(SN)及 LCRC,然后发送到对端。ACK/NAK DLLP。接收端数据链路层接收到 TLP 后,依据 SN 及 LCRC 来判断 TLP 是否被正确传输、有无丢包/坏包,并给发送端反馈 ACK 或 NAK。Tx Retry Buffer。发送端发出的每一笔 TLP 均在 Tx Retry Buffer 中进行备份。若后续接收到了 ACK,则清理 Tx Retry Buffer 中的相关 TLP;若收到了某 TLP 的 NAK 或超时未收到 ACK,则从 Tx Retry Buffer 中取出相关 TLP 进行重传。

在这里插入图片描述

▲图 7: PCIe ACK/NAK 机制示意图

友链:ACK & NAK – PCIe技术网

2022.05.20 - 每个 TLP 都要回复 Ack 吗?Ack 要多久发一次?

  并非每一笔 Good TLP 都需要回复一笔 Ack DLLP,这样效率太低了。

  PCIe Rx 数据链路层内部有个 AckNak_Latency_Timer,从收到某笔没有回复 Ack 的 TLP 就开始计时,达到指定时间后(取决于 Timer 设计)才会要一次 Ack。此前有可能会收到多比 Good TLP,这些 TLP 只回复一次 Ack,Ack 的 Sequence Number (SN) 为最新 Good TLP 的 SN。Tx 端收到 Ack 后,会把 Tx Retry Buffer 中 SN 之前的 TLP 清理掉。

2022.05.21 - 什么情况下会发送 Nak DLLP?

  简单而言,Rx 发现 Bad TLP 或 TLP 丢包时会发送 Nak。通过检测 LCRC 来检测 TLP 是否为 Bad TLP,通过 SN 还判断是否有 TLP 丢包。

2022.05.22 - TLP Tx 收到 Nak 后如何处理?

  根据 Nak DLLP 中的 SN,从 Tx Retry Buffer 中取出相应 TLP 进行重传,重传次数计数器 REPLAY_NUM 加一,重传计时器 REPLAY_TIMER 启动。

2022.05.23 - 连续多次重传失败后如何处理?

  若 TLP 多次重传均以失败告终,重传计数器 REPLAY_NUM 会溢出时,此时考虑是物理链路出现了问题,应记录错误事件并通知物理层重新对物理链路进行训练。此时数据链路层仍然是 Active 的,其 Tx Retry Buffer 不清空,相关计数器及寄存器值也不复位,等待物理链路训练完成后接着进行重传。

2022.05.24 - Retry 机制中用到的 Tx Retry Buffer Size是如何计算的?

  跟绝大多数 Buffer Size 的设计原则相同,在设计 Tx Retry Buffer Size 时应遵循两大原则:

Size 足够大,确保常规操作时收到 Ack 并清掉其对应 TLP 前 Buffer 不溢出。

在满足以上需求的前提下,Size 尽量小,以降低成本。

  第一条“收到 Ack 并清掉其对应 TLP 前 Buffer 不溢出”,这里有两个关键因素:①收到 Ack 前,②不溢出。也就是说,从某 TLP 发出并存到 Tx Retry Buffer,到收到其 Ack 后从 Tx Retry Buffer 清掉该 TLP 为后来者腾空间,这段时间内发出的所有 TLP 都能够存放在 Buffer 中且 Buffer 不溢出。需要考虑以下时延:

Rx 收到 TLP 到开始回复 Ack 的时延。Ack 的处理时延。TLP、DLLP 在物理层及物理链路上的时延。Tx Retry Buffer 所在 Device 的 Rx 从 L0s 退出到 L0 的时延。此外,对于 SRIS 时钟的 Device 或者 PCIe Retimer,也会引入额外时延。 2022.05.25 - 数据链路控制状态机是做什么的?

  数据链路层状态机(Data Link Control and Management State Machine, DLCMSM),用以①控制及管理数据链路层工作状态,②在事务层、物理层之间沟通链路状态,③触发物理层进行链路状态管理等。DLCMSM 状态转移图如下图所示。

在这里插入图片描述

▲图 8: 数据链路层控制管理状态机 2022.05.26 - DLCMSM 跟 LTSSM 有啥关系?

  DLCMSM 是数据链层状态机,LTSSM 是物理层链路训练状态机,两者各自为各自层次负责,同时又有一定的联系。

  在物理层 LTSSM 进入 Target Speed L0 之前,DLCMSM 都处于 DL_Inactive 状态,物理层训练完毕(Target Speed L0,PL_LinkUp=1)之后,DLCMSM 进入 DL_Feature 交换 DL Feature 或直接进入 DL_Init 进行流控初始化。流控初始化完成之后才进入 DL_Active 状态,至此DL_LinkUp=1。

2022.05.27 - DL_Feature 期间要交换哪些 Feature?

  DL_Feature 是一个可选的状态,只有 ①PCIe 设备支持且开启了 Data Link Feature Exchange 且 ②物理层 PL_LinkUp=1 之后,DLCMSM 才会由 DL_Inactive 进入 DL_Feature 状态。

  数据链路层处于 DL_Feature 状态(可选)时,PCIe 链路两端的数据链路层通过 Data_Link_Feature DLLP 来告知彼此支持的数据链路层特性。

Data_Link_Feature DLLP 的 Feature Support 字段来源于其 Data Link Feature Capabilities Register 的 Local Data Link Feature Supported 字段,目前只有 Local Scaled FC 这一个 Feature。当本端接收到对端发来的 Data_Link_Feature DLLP 后,回复以 Feature Ack 置一的 Data_Link_Feature DLLP。

2022.05.28 - PCIe Flow Control 是什么?

  PCIe Flow Control (FC) 是一种基于信用量 (Credit) 的点到点的 TLP 流控机制(非端到端),确保接收端有足够缓存的前提下才会发送 TLP。

  PCIe 流控逻辑位于事务层,通过 FC DLLP 来进行流控初始化及 Credit 更新。PCIe 多个虚通道(Virtual Channal, VC)之间独立进行流控,同一 VC 内,也按照根据事务类型(P/NP/CPL)及 Header/Data 分为多种 Credit 独立流控。

在这里插入图片描述

▲图 PCIe Flow Control 基本逻辑框图 (图源 Mindshare PCIe Technology)

友链:PCIe扫盲——Flow Control基础

2022.05.29 - PCIe Flow Control 用到了哪些 DLLP?

  PCIe 基于 FC DLLP 来实现流控初始化及流控 Credit 的更新。流控初始化用到的 FC DLLP 包括 InitFC1-P、InitFC1-NP、InitFC1-Cpl、InitFC2-P、InitFC2-NP、InitFC2-Cpl,Credit 更新用到的 DLLP 包括 UpdateFC-P、UpdateFC-NP 及 UpdateFC-Cpl。

2022.05.30 - Flow Control 初始化流程是怎样的?

  PCIe 流控初始化发生于物理层 LinkUp=1 之后、数据链路层 DLCMSM=DL_Init 状态时。

  PCIe 流控初始化先后分为两个阶段:

FC_Init1 阶段,PCIe 设备先后重复发送 InitFC1-P、InitFC1-NP、InitFC1-Cpl 这 3 笔 FC DLLP 到对端设备,至少每 34us 发送一次,告知其 Rx Buffer 的 Size。直到接收到对端发来的 InitFC1 DLLP 之后才停止发送,并把对端的 Buffer Size 保存起来。FC_Init2 阶段,PCIe 设备先后重复发送 InitFC2-P、InitFC2-NP、InitFC2-Cpl。此时的 FC DLLP 中不携带初始化 Credit 信息。 2022.05.31 - InitFC1 和 InitFC2 有何区别?

  InitFC2 期间发送的 InitFC2 DLLP 不携带 Credit 信息,仅用以确认流控初始化是否成功。InitFC1 期间不能发送 TLP,InitFC2 期间可以。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有